package com.dynamic.datasource.property.hikari;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.util.Properties;


/**
 * @author 王先堂
 */
@Data
public class HikariDataSourceConfig {

    /**
     * 为支持 catalog 概念的数据库设置默认 catalog
     */
    private String catalog;
    /**
     * 等待来自池的连接的最大毫秒数 默认30000
     * 如果小于250毫秒，则被重置回30秒
     */
    private Long connectionTimeout;
    /**
     * 连接将被测试活动的最大时间量 默认5000
     * 如果小于250毫秒，则会被重置回5秒
     */
    private Long validationTimeout;
    /**
     * 连接允许在池中闲置的最长时间 默认600000
     * 如果idleTimeout+1秒>maxLifetime 且 maxLifetime>0，则会被重置为0（代表永远不会退出）；如果idleTimeout!=0且小于10秒，则会被重置为10秒
     */
    private Long idleTimeout;
    /**
     * 记录消息之前连接可能离开池的时间量，表示可能的连接泄漏
     * 如果大于0且不是单元测试，则进一步判断：(leakDetectionThreshold < SECONDS.toMillis(2) or (leakDetectionThreshold > maxLifetime && maxLifetime > 0)，会被重置为0 . 即如果要生效则必须>0，而且不能小于2秒，而且当maxLifetime > 0时不能大于maxLifetime
     */
    private Long leakDetectionThreshold;
    /**
     * 池中连接最长生命周期 默认1800000
     * 如果不等于0且小于30秒则会被重置回30分钟
     */
    private Long maxLifetime;
    /**
     * 池中最大连接数，包括闲置和使用中的连接 默认10
     * 如果maxPoolSize小于1，则会被重置。当minIdle<=0被重置为DEFAULT_POOL_SIZE则为10;如果minIdle>0则重置为minIdle的值
     */
    private Integer maxPoolSize;
    /**
     * 池中维护的最小空闲连接数 默认10
     * minIdle<0或者minIdle>maxPoolSize,则被重置为maxPoolSize
     */
    private Integer minIdle;
    /**
     * 如果池无法成功初始化连接，则此属性控制池是否将 fail fast
     */
    private Long initializationFailTimeout;
    /**
     * 该属性设置一个SQL语句，在将每个新连接创建后，将其添加到池中之前执行该语句。
     */
    private String connectionInitSql;
    /**
     * 如果您的驱动程序支持JDBC4，我们强烈建议您不要设置此属性
     */
    private String connectionTestQuery;
    /**
     * 自动提交从池中返回的连接 默认true
     */
    private Boolean isAutoCommit;
    /**
     * 从池中获取的连接是否默认处于只读模式
     */
    private Boolean isReadOnly;
    /**
     * 是否在其自己的事务中隔离内部池查询，例如连接活动测试
     */
    private Boolean isIsolateInternalQueries;
    /**
     * 控制池是否可以通过JMX暂停和恢复
     */
    private Boolean isAllowPoolSuspension;
    /**
     * 该属性允许您指定池使用的Codahale / Dropwizard HealthCheckRegistry的实例来报告当前健康信息
     */
    private Properties healthCheckProperties;


    private String dataSourceClassName;
    private String dataSourceJndiName;
    private String transactionIsolationName;
    /**
     * 高版本才有
     */
    /**
     * 该属性为支持模式概念的数据库设置默认模式
     */
    private String schema;
    private String exceptionOverrideClassName;
    private Long keepaliveTime;
    private Boolean sealed;
}
